package pl.edu.pk.psb.validator;

import java.text.ParseException;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import pl.edu.pk.psb.bc.util.DataUtil;
import pl.edu.pk.psb.command.WydarzenieCommand;

@Component
public class WydarzenieValidator extends OgolnyValidator implements Validator {

	private static final String WALIDACJA_NIEPOPRAWNA_WARTOSC = "walidacja.niepoprawnaWartosc";

	@Autowired
	AdresValidator adresValidator;

	@Override
	public void validate(Object obiekt, Errors bledy) {
		WydarzenieCommand command = (WydarzenieCommand) obiekt;

		if (!czyPoprawnyString(command.getNazwa(), true)) {
			bledy.rejectValue("nazwa", WALIDACJA_NIEPOPRAWNA_WARTOSC);
		}
		try {
			Date data = DataUtil.parsujNaDate(command.getData());
			if (!DataUtil.czyDataWPrzyszlosci(data)) {
				bledy.rejectValue("data", "walidacja.dataWPrzyszlosci");
			}
		} catch (ParseException e) {
			bledy.rejectValue("data", "walidacja.zlaData");
		}
		if (!czyLiczbaZmiennoprzecinkowaDodatnia(command.getCenaNormalna())) {
			bledy.rejectValue("cenaNormalna", "walidacja.zlaCena");
		}
		if (StringUtils.isNotBlank(command.getCenaUlgowa()) && !czyLiczbaZmiennoprzecinkowaDodatnia(command.getCenaUlgowa())) {
			bledy.rejectValue("cenaUlgowa", "walidacja.zlaCena");
		}
		try {
			bledy.pushNestedPath("adres");
			ValidationUtils.invokeValidator(adresValidator, command.getAdres(), bledy);
		} finally {
			bledy.popNestedPath();
		}
		if (command.isCzyJestSala()) {
			if (!czyLiczbaCalkowitaDodatnia(command.getDlugoscSali())) {
				bledy.rejectValue("dlugoscSali", "walidacja.zlaDlugoscSali");
			}
			if (!czyLiczbaCalkowitaDodatnia(command.getSzerokoscSali())) {
				bledy.rejectValue("szerokoscSali", "walidacja.zlaSzerokoscSali");
			}
			if (StringUtils.isBlank(command.getWybraneMiejsca())) {
				bledy.rejectValue("wybraneMiejsca", "walidacja.brakMiejsc");
			}
		}
	}

	@Override
	public boolean supports(Class<?> klasa) {
		return WydarzenieCommand.class.isAssignableFrom(klasa);
	}
}
